let aGoods = {
    pic: '',
    title: '',
    desc: '',
    sellNumber: 1,
    favorRate: 2,
    price: 3,
};

class UIGoods {
    get totalPrice() {
        return this.choose * this.data.price;
    }

    get isChoose() {
        return this.choose > 0;
    }

    constructor(g) {
        g = {...g}; // 克隆一个对象
        Object.freeze(g); // 冻结克隆的对象，使得该对象内的数据不能更改
        Object.defineProperty(this, 'data', {
            get: function() {
                return g
            },
            set: function() {
                throw new Error('data属性是只读的，不能重新赋值！！！')
            },
            configurable: false
        });
        let internalChooseValue = 0;
        Object.defineProperty(this, 'choose', {
            get: function() {
                return internalChooseValue
            },
            set: function(val) {
                if(typeof val !== 'number') {
                    throw new Error('choose属性必须是数字')
                }
                let temp = parseInt(val);
                if(temp !== val) {
                    throw new Error('choose属性必须是整数')
                }
                if(val < 0) {
                    throw new Error('choose属性必须大于等于0')
                }
                internalChooseValue = val;
            },
            configurable: false
        });
        this.a = 1;
        Object.seal(this); // 密封  普通属性都能改，但是不能外加属性了
    }
}

Object.freeze(UIGoods.prototype); // 冻结原型对象，原型对象上就加不了属性

let g = new UIGoods(aGoods);
UIGoods.prototype.haha = 'abc';
// g.data.price = 100;

console.log(g.haha);